// // // #include <stdio.h>
// // // #include <stdlib.h>
// // // #include <unistd.h>
// // // #include "serial_recv.h"

// // // int main(int argc, char *argv[]) {
// // //     if (argc < 3) {
// // //         printf("Usage: %s <serial_dev> <baudrate>\n", argv[0]);
// // //         printf("Example: %s /dev/ttyF0 115200\n", argv[0]);
// // //         return 1;
// // //     }
    
// // //     int baudrate = atoi(argv[2]);
// // //     speed_t speed = get_baud_rate(baudrate);
// // //     if (speed == -1) {
// // //         fprintf(stderr, "Unsupported baudrate\n");
// // //         return 1;
// // //     }
    
// // //     int fd = open_serial(argv[1], speed);
// // //     if (fd < 0) return 1;

// // //     unsigned char send_buf4[] = {0x01, 0x00, 0x01, 0x1D, 0xE8, 0x03, 0x00, 0x00, 0x0A};//左1
// // //     unsigned char send_buf2[] = {0x01, 0x00, 0x01, 0x1D, 0xE8, 0x03, 0x00, 0x00, 0x0A};//左2
// // //     unsigned char send_buf1[] = {0x01, 0x00, 0x01, 0x1D, 0xE8, 0x03, 0x00, 0x00, 0x0A};
// // //     unsigned char send_buf3[] = {0x01, 0x00, 0x01, 0x1D, 0xE8, 0x03, 0x00, 0x00, 0x0A};
// // //     unsigned char* send_bufs[] = {send_buf1, send_buf2, send_buf3, send_buf4};
// // //     int send_lens[] = {sizeof(send_buf1), sizeof(send_buf2), sizeof(send_buf3), sizeof(send_buf4)};
// // //     int idx = 0;
    
// // //     while (1) {
// // //         unsigned char* send_buf = send_bufs[idx];
// // //         int send_len = send_lens[idx];
// // //         idx = (idx + 1) % 4;

// // //         int n = write(fd, send_buf, send_len);
// // //         if (n < 0) {
// // //             perror("write");
// // //             break;
// // //         }
// // //         tcdrain(fd);
// // //         printf("Send: ");
// // //         for (int i = 0; i < send_len; ++i) {
// // //             printf("%02X ", send_buf[i]);
// // //         }
// // //         printf("\n");
// // //         fflush(stdout);
// // //         usleep(500000);
// // //     }

// // //     close(fd);
// // //     return 0;
// // // }

// // #include <stdio.h>
// // #include <stdlib.h>
// // #include <unistd.h>
// // #include <string.h>
// // #include <fcntl.h>
// // #include <termios.h>
// // #include <time.h>
// // #include <errno.h>
// // #include "serial_recv.h"



// // // 高精度延时函数（使用nanosleep）
// // void precise_delay(long nanoseconds) {
// //     struct timespec req, rem;
// //     req.tv_sec = 0;
// //     req.tv_nsec = nanoseconds;
    
// //     // 处理被信号中断的情况
// //     while (nanosleep(&req, &rem) == -1 && errno == EINTR) {
// //         req = rem;
// //     }
// // }

// // int main(int argc, char *argv[]) {
// //     if (argc < 6) {
// //         printf("Usage: %s <serial_dev> <baudrate> <value1> <value2> <value3>\n", argv[0]);
// //         printf("Example: %s /dev/ttyF0 1152000 01 00 01\n", argv[0]);
// //         return 1;
// //     }
    
// //     int baudrate = atoi(argv[2]);
// //     speed_t speed = get_baud_rate(baudrate);
// //     if (speed == -1) {
// //         fprintf(stderr, "Unsupported baudrate\n");
// //         return 1;
// //     }
    
// //     int fd = open_serial(argv[1], speed);
// //     if (fd < 0) {
// //         perror("open_serial");
// //         return 1;
// //     }

// //     // 设置串口为原始模式，减少软件层延迟
// //     struct termios options;
// //     tcgetattr(fd, &options);
// //     cfmakeraw(&options);
// //     options.c_oflag &= ~OPOST;  // 禁用输出处理
// //     tcsetattr(fd, TCSANOW, &options);

// //     // 从命令行参数获取三个数值
// //     unsigned char value1 = (unsigned char)atoi(argv[3]);
// //     unsigned char value2 = (unsigned char)atoi(argv[4]);
// //     unsigned char value3 = (unsigned char)atoi(argv[5]);

// //     // 初始化发送缓冲区
// //     unsigned char send_buf[9] = {
// //         value1,           // 第一个数值
// //         value2,           // 第二个数值
// //         value3,           // 第三个数值
// //         0x1D, 0xE8, 0x03, // 固定值
// //         0x00, 0x00, 0x0A  // 固定值
// //     };

// //     int send_len = sizeof(send_buf);
    
// //     // 高精度定时器初始化
// //     struct timespec next_time;
// //     clock_gettime(CLOCK_MONOTONIC, &next_time);
    
// //     // 计算50ms的纳秒数
// //     const long interval_ns = 50 * 1000000; // 50ms = 50,000,000ns
    
// //     // 记录发送统计信息
// //     unsigned int total_packets = 0;
// //     unsigned int late_packets = 0;
    
// //     while (1) {
// //         // 执行发送操作
// //         int n = write(fd, send_buf, send_len);
// //         if (n < 0) {
// //             perror("write");
// //             break;
// //         }
        
// //         // 等待所有数据进入硬件FIFO
// //         tcdrain(fd);
        
// //         // 更新统计信息
// //         total_packets++;
        
// //         // 计算下一次发送时间点
// //         next_time.tv_nsec += interval_ns;
        
// //         // 处理纳秒溢出
// //         while (next_time.tv_nsec >= 1000000000) {
// //             next_time.tv_nsec -= 1000000000;
// //             next_time.tv_sec++;
// //         }
        
// //         // 获取当前时间
// //         struct timespec now;
// //         clock_gettime(CLOCK_MONOTONIC, &now);
        
// //         // 计算需要延时的时间
// //         long delay_ns = (next_time.tv_sec - now.tv_sec) * 1000000000 + 
// //                         (next_time.tv_nsec - now.tv_nsec);
        
// //         // 如果已经晚了，则立即发送下一包，并记录延迟情况
// //         if (delay_ns <= 0) {
// //             late_packets++;
// //             // 计算累积延迟，用于调试
// //             long accumulated_late = -delay_ns;
// //             printf("Warning: packet %u late by %ld ns\n", total_packets, accumulated_late);
            
// //             // 设置下一个时间点为当前时间加上间隔
// //             clock_gettime(CLOCK_MONOTONIC, &next_time);
// //             next_time.tv_nsec += interval_ns;
// //             // 再次处理纳秒溢出
// //             while (next_time.tv_nsec >= 1000000000) {
// //                 next_time.tv_nsec -= 1000000000;
// //                 next_time.tv_sec++;
// //             }
            
// //             continue; // 立即发送下一包
// //         }
        
// //         // 执行高精度延时
// //         precise_delay(delay_ns);
        
// //         // 每1000包打印一次统计信息
// //         if (total_packets % 1000 == 0) {
// //             printf("Sent %u packets, %u late (%.2f%%)\n", 
// //                    total_packets, late_packets, 
// //                    (float)late_packets / total_packets * 100);
// //         }
// //     }

// //     close(fd);
// //     return 0;
// // }
// #include <stdio.h>
// #include <stdlib.h>
// #include <unistd.h>
// #include <string.h>
// #include <fcntl.h>
// #include <termios.h>
// #include <time.h>
// #include <errno.h>
// #include "serial_recv.h"

// void print_timestamp(){
//     struct timespec ts;
//     clock_gettime(CLOCK_REALTIME, &ts);
//     long long microseconds = ts.tv_sec * 1000000LL + ts.tv_nsec / 1000;
//     printf("%lld.%06lld ", microseconds / 1000000, microseconds % 1000000);
// }

// int main(int argc, char *argv[]) {
//     if (argc < 6) {
//         printf("Usage: %s <serial_dev> <baudrate> <value1> <value2> <value3>\n", argv[0]);
//         printf("Example: %s /dev/ttyF0 1152000 01 00 01\n", argv[0]);
//         return 1;
//     }
    
//     int baudrate = atoi(argv[2]);
//     speed_t speed = get_baud_rate(baudrate);
//     if (speed == -1) {
//         fprintf(stderr, "Unsupported baudrate\n");
//         return 1;
//     }
    
//     int fd = open_serial(argv[1], speed);
//     if (fd < 0) return 1;

//     // 从命令行参数获取三个数值
//     unsigned char value1 = (unsigned char)atoi(argv[3]);
//     unsigned char value2 = (unsigned char)atoi(argv[4]);
//     unsigned char value3 = (unsigned char)atoi(argv[5]);

//     // 初始化发送缓冲区，前三个字节为命令行参数值，其余为固定值
//     unsigned char send_buf[12] = {
//         value1,           // 第一个数值
//         value2,           // 第二个数值
//         value3,           // 第三个数值
//         0x1D, 0xE8, 0x03, // 固定值
//         0x00, 0x00, 0x0A,
//         0x00, 0x00, 0x0A  // 固定值
//     };

//     int send_len = sizeof(send_buf);
//     // printf("时间戳");
//     // printf(" -------\n");

    
//     while (1) {
//         int n = write(fd, send_buf, send_len);
//         if (n < 0) {
//             perror("write");
//             break;
//         }
//         tcdrain(fd);
//         print_timestamp();
//         printf("Send: ");
//         for (int i = 0; i < send_len; ++i) {
//             printf("%02X ", send_buf[i]);
//         }
//         printf("\n");
//         usleep(20000); // 0.2ms间隔
//     }

//     close(fd);
//     return 0;
// }



// #include <stdio.h>
// #include <stdlib.h>
// #include <unistd.h>
// #include <string.h>
// #include <fcntl.h>
// #include <termios.h>
// #include <time.h>
// #include <errno.h>
// #include "serial_recv.h"

// void print_timestamp(){
//     struct timespec ts;
//     clock_gettime(CLOCK_REALTIME, &ts);
//     long long microseconds = ts.tv_sec * 1000000LL + ts.tv_nsec / 1000;
//     printf("%lld.%06lld ", microseconds / 1000000, microseconds % 1000000);
// }

// int main(int argc, char *argv[]) {
//     if (argc < 6) {
//         printf("Usage: %s <serial_dev> <baudrate> <value1> <value2> <value3>\n", argv[0]);
//         printf("Example: %s /dev/ttyF0 1152000 01 00 01\n", argv[0]);
//         return 1;
//     }
    
//     int baudrate = atoi(argv[2]);
//     speed_t speed = get_baud_rate(baudrate);
//     if (speed == -1) {
//         fprintf(stderr, "Unsupported baudrate\n");
//         return 1;
//     }
    
//     int fd = open_serial(argv[1], speed);
//     if (fd < 0) return 1;

//     // 从命令行参数获取三个数值
//     unsigned char value1 = (unsigned char)atoi(argv[3]);
//     unsigned char value2 = (unsigned char)atoi(argv[4]);
//     unsigned char value3 = (unsigned char)atoi(argv[5]);

//     // 初始化发送缓冲区，前三个字节为命令行参数值，其余为固定值
//     unsigned char send_buf[12] = {
//         value1,           // 第一个数值
//         value2,           // 第二个数值
//         value3,           // 第三个数值
//         0x1D, 0xE8, 0x03, // 固定值
//         0x00, 0x00, 0x0A,
//         0x00, 0x00, 0x0A  // 固定值
//     };

//     int send_len = sizeof(send_buf);
//     // printf("时间戳");
//     // printf(" -------\n");

    
//     while (1) {
//         int n = write(fd, send_buf, send_len);
//         if (n < 0) {
//             perror("write");
//             break;
//         }
//         tcdrain(fd);
//         // print_timestamp();
//         // printf("Send: ");
//         // for (int i = 0; i < send_len; ++i) {
//         //     printf("%02X ", send_buf[i]);
//         // }
//         // printf("\n");
//         fflush(stdout);
//         usleep(200); // 0.2ms间隔
//     }

//     close(fd);
//     return 0;
// }

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <time.h>
#include <errno.h>
#include "serial_recv.h"

void print_timestamp() {
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    long long microseconds = ts.tv_sec * 1000000LL + ts.tv_nsec / 1000;
    printf("%lld.%06lld ", microseconds / 1000000, microseconds % 1000000);
}

int main(int argc, char *argv[]) {
    if (argc < 5) {
        printf("Usage: %s <serial_dev> <baudrate> <value1> <value2> <value3>\n", argv[0]);
        printf("Example: %s /dev/ttyF0 1152000 01 00 01\n", argv[0]);
        return 1;
    }
    
    int baudrate = atoi(argv[2]);
    speed_t speed = get_baud_rate(baudrate);
    if (speed == -1) {
        fprintf(stderr, "Unsupported baudrate\n");
        return 1;
    }
    
    int fd = open_serial(argv[1], speed);
    if (fd < 0) return 1;


    // 从命令行参数获取三个数值
    unsigned char value1 = (unsigned char)atoi(argv[3]);
    unsigned char value2 = (unsigned char)atoi(argv[4]);
    // unsigned char value3 = (unsigned char)atoi(argv[5]);

    // 初始化发送缓冲区
    unsigned char send_buf[11] = {
        value1,           // 第一个数值
        value2,           // 第二个数值
        0x01,           // 第三个数值
        0x1D, 0xE8, 0x03, // 固定值
        0x00, 0x00, 0x00, 0x00, 0x0A  // 固定值
        
    };

    int send_len = sizeof(send_buf);
    int channel_toggle = 0; // 通道切换标志
    
    while (1) {

        if(channel_toggle == 0) {
            send_buf[2] = 0x01; // 通道1
        } else {
            send_buf[2] = 0x04; // 通道4
        }
        channel_toggle = !channel_toggle;  // 翻转标志
        // 发送数据
        int n = write(fd, send_buf, send_len);
        if (n < 0) {
            perror("write");
            break;
        }
        tcdrain(fd);
        
        // //打印时间戳和发送内容
        // print_timestamp();
        // printf("Send: ");
        // for (int i = 0; i < send_len; ++i) {
        //     printf("%02X ", send_buf[i]);
        // }
        // printf("\n");
        fflush(stdout);
        
        usleep(300); // 0.2ms间隔
    }

    close(fd);
    return 0;
}